package com.stsdai.portal.service;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.stsdai.manager.pojo.Cart;
import com.stsdai.manager.pojo.Item;
import com.stsdai.manager.service.ItemService;
import com.stsdai.portal.util.CookieUtils;

@Service
public class CartCookieService {

	private static final ObjectMapper MAPPER = new ObjectMapper();

	@Autowired
	private ItemService itemService;

	@Value("${STSD_CART}")
	private String STSD_CART;

	/**
	 * 添加商品到cookie中的购物车
	 * 
	 * @param request
	 * @param response
	 * @param itemId
	 * @param num
	 */
	public void addItemByCart(HttpServletRequest request, HttpServletResponse response, Long itemId, Integer num) {
		// 查询用户原来的购物车
		List<Cart> list = this.queryCartByCookie(request);

		// 声明购物车对象
		Cart cart = null;

		// 遍历购物车
		for (Cart c : list) {
			// 判断购物车中是否存在该商品
			if (c.getItemId().longValue() == itemId.longValue()) {
				// 如果存在，给购物车对象赋值
				cart = c;

				// 跳出循环
				break;
			}
		}

		if (cart != null) {
			// 如果cart不为空，表示商品存在，则商品数量相加
			cart.setNum(cart.getNum() + num);
			cart.setUpdated(new Date());

		} else {
			// 如果cart为空，表示商品不存在，则把商品添加到购物车中
			// 查询商品数据
			Item item = this.itemService.queryById(itemId);

			// 创建购物车对象
			cart = new Cart();

			// 给购物车，设置商品数据
			cart.setNum(num);
			cart.setUserId(null);
			cart.setItemId(itemId);
			// 判断商品图片不为空
			if (item.getImages() != null) {
				cart.setItemImage(item.getImages()[0]);
			} else {
				// 如果图片为空，设置空串
				cart.setItemImage("");
			}
			cart.setItemPrice(item.getPrice());
			cart.setItemTitle(item.getTitle());
			cart.setCreated(new Date());
			cart.setUpdated(cart.getCreated());

			// 添加到购物车中
			list.add(cart);

		}
		
		/*String json = null; 
		try {
			json = MAPPER.writeValueAsString(list);
		} catch (JsonProcessingException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}*/
		try {
			// 把修改后的购物车保存到Cookie,需要把购物车list转为json格式的数据
			CookieUtils.setCookie(request, response, this.STSD_CART, MAPPER.writeValueAsString(list), 60 * 60 * 24, true);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

	/**
	 * 查询cookie中的购物车数据
	 * 
	 * @param request
	 * @return
	 */
	public List<Cart> queryCartByCookie(HttpServletRequest request) {
		// 从redis中查询原来的购物车，查询到的是json格式的数据
		// 购物车的key需要添加前缀，方便redis维护和管理，key：前缀+用户id
		String json = CookieUtils.getCookieValue(request, this.STSD_CART, true);

		// 判断json数据不为空
		if (StringUtils.isNotBlank(json)) {
			try {
				// 把json格式的数据转为List《Cart》购物车数据
				List<Cart> list = MAPPER.readValue(json,
						MAPPER.getTypeFactory().constructCollectionType(List.class, Cart.class));

				// 返回购物车数据
				return list;
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

		// 如果查询结果为空，或者转换异常，不能返回null，需要返回空集合
		return new ArrayList<>();
	}

	/**
	 * 修改cookie中购物车的商品数量
	 * 
	 * @param request
	 * @param response
	 * @param itemId
	 * @param num
	 */
	public void updateNumByCart(HttpServletRequest request, HttpServletResponse response, Long itemId, Integer num) {
		// 查询用户的购物车
		List<Cart> list = this.queryCartByCookie(request);

		// 遍历购物车
		for (Cart cart : list) {
			// 判断购物车中是否存在该商品
			if (cart.getItemId().longValue() == itemId.longValue()) {
				// 如果存在商品，修改商品数量
				cart.setNum(num);
				cart.setUpdated(new Date());

				try {
					// 把修改后的购物车保存到cookie中
					CookieUtils.setCookie(request, response, this.STSD_CART, MAPPER.writeValueAsString(list),
							60 * 60 * 24, true);
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}

				// 跳出循环
				break;
			}
		}
	}

	/**
	 * 删除cookie中购物车的商品
	 * 
	 * @param request
	 * @param response
	 * @param itemId
	 */
	public void deleteItemById(HttpServletRequest request, HttpServletResponse response, Long itemId) {
		// 查询
		List<Cart> list = this.queryCartByCookie(request);

		// 遍历
		for (Cart cart : list) {
			// 判断
			if (cart.getItemId().longValue() == itemId.longValue()) {
				// 删除
				list.remove(cart);

				try {
					// 把修改后的购物车保存到cookie中
					CookieUtils.setCookie(request, response, this.STSD_CART, MAPPER.writeValueAsString(list),
							60 * 60 * 24, true);
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}

				// 跳出
				break;
			}
		}
	}

}
